// 正向查找,返回元素的索引值 publicintindexOf(Object o){ if (o == null) { for (int i = 0; i < size; i++) if (elementData[i]==null) return i; } else { for (int i = 0; i < size; i++) if (o.equals(elementData[i])) return i; } return -1; }
// 反向查找(从数组末尾向开始查找),返回元素(o)的索引值 publicintlastIndexOf(Object o){ if (o == null) { for (int i = size-1; i >= 0; i--) if (elementData[i]==null) return i; } else { for (int i = size-1; i >= 0; i--) if (o.equals(elementData[i])) return i; } return -1; }
// 返回ArrayList的Object数组 public Object[] toArray() { return Arrays.copyOf(elementData, size); }
// 返回ArrayList的模板数组。所谓模板数组,即可以将T设为任意的数据类型 public <T> T[] toArray(T[] a) { // 若数组a的大小 < ArrayList的元素个数; // 则新建一个T[]数组,数组大小是“ArrayList的元素个数”,并将“ArrayList”全部拷贝到新数组中 if (a.length < size) return (T[]) Arrays.copyOf(elementData, size, a.getClass());
// 删除ArrayList指定位置的元素 public E remove(int index){ RangeCheck(index);
modCount++; E oldValue = (E) elementData[index];
int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // Let gc do its work
return oldValue; }
// 删除ArrayList的指定元素 publicbooleanremove(Object o){ if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) { fastRemove(index); returntrue; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); returntrue; } } returnfalse; }
// 快速删除第index个元素 privatevoidfastRemove(int index){ modCount++; int numMoved = size - index - 1; // 从"index+1"开始,用后面的元素替换前面的元素。 if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); // 将最后一个元素设为null elementData[--size] = null; // Let gc do its work }
// 删除元素 publicbooleanremove(Object o){ if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) { fastRemove(index); returntrue; } } else { // 便利ArrayList,找到“元素o”,则删除,并返回true。 for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); returntrue; } } returnfalse; }
// 克隆函数 public Object clone(){ try { ArrayList<E> v = (ArrayList<E>) super.clone(); // 将当前ArrayList的全部元素拷贝到v中 v.elementData = Arrays.copyOf(elementData, size); v.modCount = 0; return v; } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable thrownew InternalError(); } }
// java.io.Serializable的写入函数 // 将ArrayList的“容量,所有的元素值”都写入到输出流中 privatevoidwriteObject(java.io.ObjectOutputStream s) throws java.io.IOException{ // Write out element count, and any hidden stuff int expectedModCount = modCount; s.defaultWriteObject();
// 写入“数组的容量” s.writeInt(elementData.length);
// 写入“数组的每一个元素”,因为elementData[]前有transient关键字 for (int i=0; i<size; i++) s.writeObject(elementData[i]); //防止并发修改 if (modCount != expectedModCount) { thrownew ConcurrentModificationException(); }
}
// java.io.Serializable的读取函数:根据写入方式读出 // 先将ArrayList的“容量”读出,然后将“所有的元素值”读出 privatevoidreadObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { // Read in size, and any hidden stuff s.defaultReadObject(); //按写入的顺序读出 // 从输入流中读取ArrayList的“容量” int arrayLength = s.readInt(); Object[] a = elementData = new Object[arrayLength];
publicstaticvoidmain(String[] args){ sub [] subArray = {new sub(), new sub()}; System.out.println("subArray数组里的元素的实际类型" + "\n" + subArray.getClass().getSimpleName() + "\n"); base[] baseArray = subArray; System.out.println("baseArray数组里的元素的实际类型" + "\n" + baseArray.getClass().getSimpleName()); baseArray[0] = new base(); } 输出: subArray数组里的元素的实际类型 sub[] baseArray数组里的元素的实际类型 sub[] Exception in thread "main" java.lang.ArrayStoreException: yu.base at yu.Lian4.main(Lian4.java:45)
Sub 继承自 Base,由于Sub数组中每一个元素都是 Sub对象,所以Base [] baseArray = subArray;这种强制类型转换不会报错。 这 其实就是java对象的向上转型,子类数组转换成父类数组是允许的 。但是由于数组中元素类型都是Sub类型的,所以 baseArray[0] = new Base ();会 报错java.lang.ArrayStoreException。这也就是说假如我们有1个Object[]数组,并不代表着我们可以将Object对象存进去,这取决于数组中元素实际的类型。
实例二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
public static void main(String[] args) { List<String> list = Arrays.asList("123"); //Arrays类里的一个内部类ArrayList而不是java.util.ArrayList System.out.println(list.getClass());//输出实际类型 Object[]objArray = list.toArray(); System.out.println(list.getClass());//输出实际类型 objArray[0] = new Object(); } 输出: class java.util.Arrays$ArrayList class java.util.Arrays$ArrayList Exception in thread "main" java.lang.ArrayStoreException: java.lang.Object at yu.Lian4.main(Lian4.java:46)